package person.bing.fbcloud.leetcode;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * 15. 三数之和
 *
 * 给你一个包含 n 个整数的数组 nums，判断 nums 中是否存在三个元素 a，b，c ，使得 a + b + c = 0 ？
 * 请你找出所有满足条件且不重复的三元组。
 * 注意：答案中不可以包含重复的三元组。
 *
 * @author: mengfanbing
 * @date: 2020/7/10 10:03
 */
public class Q15 {
    public static void main(String[] args) {
        int[] param = {-1,0,1,2,-1,-4};
        List<List<Integer>> ans = threeSum(param);
        System.out.println(ans);
    }
    public static List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> ans = new ArrayList<>();
        int length = nums.length;
        Arrays.sort(nums);
        for (int i=0;i<length-2;i++){
            if (nums[i] > 0){
                break;
            }
            if (i > 0 && nums[i] == nums[i-1]){
                continue;
            }
            int a = i+1;
            int b = length-1;
            while(a < b){
                if (a > i+1 && nums[a] == nums[a-1]){
                    a++;
                    continue;
                }
                if (b < length-1 && nums[b] == nums[b+1]){
                    b--;
                    continue;
                }
                int sum = nums[a] + nums[b] + nums[i];
                if (sum == 0){
                    List<Integer> temp = new ArrayList<>();
                    temp.add(nums[i]);
                    temp.add(nums[a]);
                    temp.add(nums[b]);
                    ans.add(temp);
                    b--;
                    a++;
                }else if (sum > 0){
                    b--;
                }else {
                    a++;
                }
            }
        }
        return ans;
    }
}
